 import matplotlib
from pylab import *

class Population:
    print "-----Bevoelkerungswachstum 2.0-----"
    print "------------------------"
    
    def __init__(self, initialpop, birthrate, deathrate, initialtime, finaltime, timestep=1,species = "EinwohnerInnen",capacity =0, influ=0.01): 
        '''
        Die Methode initialisiert alle Attribute und macht diese für alle
        Methoden der Klasse verfügbar.
        
        Args:
            initialpop: Initial population
            
        
        '''
        self.initialpop = [initialpop]
        self.birthrate = birthrate
        self.deathrate = deathrate
        self.finaltime = finaltime
        self.initialtime = [initialtime]
        self.finaltime = finaltime
        self.timestep = timestep
        self.species = species
        self.capacity = capacity
        self.influ = influ
        
        print "-----Es wird das Wachstum einer", self.species, "-Bevoelkerung mit dem Anfangswert"
        print "-----von", self.initialpop[0], self.species
        print "-----im Zeitraum von", self.initialtime[0],"bis", self.finaltime
        print "-----bei konstanter Geburtenrate (", self.birthrate,") und Sterberate (", deathrate,")"
        print "-----in Zeitschritten von ", self.timestep, "berechnet."
        print "########################"
    
    def birth(self,initialpop):    
        '''
        Methode zur Berechnung der Geburten innerhalb eines Zeitschrittes.
        '''
        return initialpop * self.birthrate * self.timestep
    
    def death (self,initialpop):
        '''
        Methode zur Berechnung der Todesfälle innerhalb eines Zeitschrittes.
        '''
        return initialpop * self.deathrate * self.timestep

    def setPop(self):
        '''
        Methode zur Berechnung der Bevölkerung. Es wird die Anzahl der Zeitschritte
        ausgegeben, damit überprüft werden kann, ob es sich dabei um eine ganze Zahl
        handelt.
        Kommentarzeichen # entfernen, wenn die Entwicklung am Bildschirm
        nachvollzogen werden soll.
        Die Werte der Bevölkerung und der dazugehörigen Zeit (für jeden Zeitschritt) werden in jeweils eine
        Liste geschrieben.
        '''
        self.timerange = self.finaltime - self.initialtime[0]
        print "##################"
        print "-----Gesamtanzahl der Zeitschritte:", self.timerange / self.timestep

        for time in range (int(self.timerange / self.timestep)):
            self.initialtime.append(self.initialtime[time] + self.timestep)
            self.initialpop.append(self.initialpop[time] + self.birth(self.initialpop[time]) - self.death(self.initialpop[time]))
            #print "Nach", self.initialtime[time], "Jahren:", self.initialpop[time], self.species
        return self.initialpop
    
    def getPop (self):
        '''
        Methode, die die Bevölkerungszahl zum festgelegten Ende ausgibt.
        '''
        self.setPop()
        print ""
        print "-----Bevoelkerung nach", self.initialtime[int(self.timerange/self.timestep)], "Jahren:", self.initialpop[int(self.timerange/self.timestep)], self.species
    
    def plotPop(self):
        '''
        Methode, die die Bevölkerungsentwicklung graphisch darstellt (mit Hilfe von
        matplotlib und pyplot). Dazu werden alle in die Listen geschriebenen Werte
        geplottet ("ro": mit roten Punkten, keine Linie). Achsen sind von den
        Anfangs- und Endwerten der Zeit und Bevölkerung abhängig.
        '''
        x_series = [self.initialtime]
        y1_series = [self.initialpop]
        y2_series = [self.prey.initialpop]
        y3_series = [self.pred.initialpop]
        axis([self.initialtime[0], self.finaltime, (min(self.prey.initialpop[int(self.timerange/self.timestep)], self.pred.initialpop[int(self.timerange/self.timestep)], self.initialpop[int(self.timerange/self.timestep)], self.prey.initialpop[0], self.pred.initialpop[0], self.initialpop[0])), (max(self.prey.initialpop[0], self.pred.initialpop[0], self.initialpop[0], self.prey.initialpop[int(self.timerange/self.timestep)], self.pred.initialpop[int(self.timerange/self.timestep)], self.initialpop[int(self.timerange/self.timestep)]))])
        plot(x_series, y1_series, "bo", x_series, y2_series, "ro", x_series, y3_series, "go")
        xlabel("Zeit")
        ylabel(self.species)
        title("Bevoelkerungsentwicklung")
        show()

        #(max(self.prey.initialpop[0], self.pred.initialpop[0], self.initialpop[0]))
    def setPred(self,pred):
        '''
        Diese Methode kann einer Räuberinstanz eine
        Beuteinstanz zuweisen. Nur dadurch kann die eine Instanz auf die
        Variablen der jeweils anderen zugreifen.
        '''
        self.pred = pred
        
    def setPrey(self,prey):
        '''
        Siehe oben, nur umgekehrt.
        '''
        self.prey = prey

#meine_Population = Population(80000000,0.18,0.2,2011,2250,0.1)
#meine_Population.getPop()
#meine_Population.plotPop()
'''
Initialisiert das Objekt meine_Population der Klasse Population mit wählbaren
Attributen und ruft die Methoden getPop und plotPop der Klasse auf.
'''
